#include <Includes.h>
#include <main.h>

EventGroupHandle_t xWDGEventGroup=NULL;
EventBits_t WDGBitTaskAll=0;


void WDG_Feed(int tid)
{
    if(xWDGEventGroup!=NULL)
        xEventGroupSetBits(xWDGEventGroup,1<<tid);
}

void WDG_Barking()
{
    OS_REBOOT();
}

EventBits_t WDG_TaskBitInit()
{
    EventBits_t uxBits=0;
    for(int i=0;i<TASK_ID_MAX;i++){
        if(task_tbl[i].feedWdg)
            uxBits |= (1<<task_tbl[i].id);
    }
    return uxBits;
}

void PrintWdg(EventBits_t uxBits)
{
    int i;
    for(i=0;i<TASK_ID_MAX;i++)
    {
        if(task_tbl[i].feedWdg)
        {
            if((uxBits & (1<<task_tbl[i].id)) != (1<<task_tbl[i].id) )
                rprintf("\r\n######Dog Bark Caused by task[%s]######\r\n",task_tbl[i].name);
        }
    }
}
/**
  * @brief  看门狗任务
  * @param  argument
  * @retval None
  */
void TaskWDG(void * argument)
{
	static TickType_t	xTicksToWait = 2000 / portTICK_PERIOD_MS; /* 最大延迟1s */
	EventBits_t			uxBits;
	//EventBits_t         WDG_BIT_TASK_ALL=0;
    
	/* 创建事件标志组 */
	xWDGEventGroup = xEventGroupCreate();
	if(xWDGEventGroup == NULL)
    {
        /* 没有创建成功，用户可以在这里加入创建失败的处理机制 */
		return;
    }
	WDGBitTaskAll = WDG_TaskBitInit();
    while(1)
	{
		/* 等待所有任务发来事件标志 */
		uxBits = xEventGroupWaitBits(xWDGEventGroup, 	/* 事件标志组句柄 */
							         WDGBitTaskAll,		/* 等待WDG_BIT_TASK_ALL被设置 */
							         pdTRUE,				/* 退出前WDG_BIT_TASK_ALL被清除，这里是TASK_BIT_ALL都被设置才表示“退出”*/
							         pdTRUE,				/* 设置为pdTRUE表示等待TASK_BIT_ALL都被设置*/
							         xTicksToWait);			/* 等待延迟时间 */
		
		if((uxBits & WDGBitTaskAll) != WDGBitTaskAll)
		{
            PrintWdg(uxBits);
            WDG_Barking();
		}
	}
}


